package com.unitop.analyse.util;

import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/*******************************************************************************
 * arr[][]={{1,4}, 00 01 
 * 			{9,12}, 10 11 
 * 			{17,22}, 20 21 
 * 			{29,43}} 30 31 
 * 
 * @Date : Apr 14, 2011
 * @ProjectName : analyse
 * @author : Ricky Zhang
 * @Email : zhangyidong0007@hotmail.com
 * 
 */
public class CreateCv {
	/***************************************************************************
	 * 关键字map
	 */
	private static final Map<String, String> keyWordsMap = new HashMap<String, String>();

	public static final String INDEXMAP = "INDEXMAP";
	public static final String INDEXARRAY = "INDEXARRAY";

	/***************************************************************************
	 * name 				= "名字,名 字,姓名,姓 名"; 
	 * sex 					= "性别,性 别,"; 
	 * age 					= "年龄,年 龄"; 
	 * birth 				= "出生年月,出 生 年 月"; 
	 * graduateUniversity 	= "毕业大学,大学,学院,毕 业 大 学,大 学,学 院"; 
	 * education 			="学历,学 历"; 
	 * companyPhone 		= "公司电话,公 司 电 话"; 
	 * mobilePhone			="手机,移动电话,手机号码,个人电话,手 机,移 动 电 话,手 机 号 码,个 人 电 话"; 
	 * homePhone 			= "家庭电话,家 庭 电 话";
	 * 
	 * @param args
	 * @throws Exception
	 */
	public static void main(String[] args) throws Exception {
		String targetStr = "姓 名:： 张三 年龄 ：18 \r\n\r\n 出生年月 :1986年11月22日 手机136411887264   \r\n\r\n 学历 大专  性别男";
		CreateCv c = new CreateCv();
		c.getXMLStr(targetStr);
	//	System.out.println(c.getIndex(targetStr));
	}

	/***************************************************************************
	 * 构造方法，初始化关键字map
	 * 
	 * @throws SecurityException
	 * @throws NoSuchFieldException
	 * @throws IllegalArgumentException
	 * @throws IllegalAccessException
	 */
	public CreateCv() throws SecurityException, NoSuchFieldException,
			IllegalArgumentException, IllegalAccessException {
		Field field[] = Keyword.class.getDeclaredFields();
		for (int x = 1; x < field.length; x++) {
			Field title = Keyword.class.getDeclaredField(field[x].getName());
			title.setAccessible(true);
			keyWordsMap.put(title.getName(), (String) title.get(Keyword
					.getInstance()));
		}

	}

	/***************************************************************************
	 * 去除String中多余的空格以及换行 1）去除换行 2）去除空格
	 * 
	 * @param str
	 * @return
	 */
	private String clean(String str) {
		// 去除换行
		Pattern pattern = Pattern.compile("[\\r\\n]{2,}");
		Matcher matcher = pattern.matcher(str);
		String result = matcher.replaceAll("\r\n");
		//去除多余符号
		pattern = Pattern.compile(":{1,}|：{1,}");
		matcher = pattern.matcher(result);
		result = matcher.replaceAll("");
		// 去除多余空格
		pattern = Pattern.compile(" {2,}|\t{1,}|:|：");
		matcher = pattern.matcher(result);
		result = matcher.replaceAll(" ");

		return result;
	}

	/***************************************************************************
	 * 根据简历以及需要截取的关键字，返回生成的xml文件
	 * 
	 * @param targetStr
	 * @return
	 */
	public String getXMLStr(String targetStr) {
		// 1清理string中的空格和换行
		targetStr = clean(targetStr);
		
		// 生成索引的二维List
		Map indexMap = getIndex(targetStr);
		//得到XML每一个Tag的映射
		Map tagMap=(Map)indexMap.get(INDEXMAP);
		//得到每个关键字的索引
		int [][]array=(int [][])indexMap.get(INDEXARRAY);
		
		StringBuffer sb = new StringBuffer();
		sb.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
		sb.append("<info>");
		
		for(int x=0;x<array.length;x++){
			StringBuffer value=new StringBuffer();
			try{
				value.append(targetStr.substring(array[x][1],array[x+1][0]).trim());
			}catch(java.lang.ArrayIndexOutOfBoundsException e){
				value.append(targetStr.substring(array[x][1]).trim());
			}
			if(value.length()>0){
				sb.append("<"+tagMap.get(array[x][1])+">");
				sb.append(value);
				sb.append("</"+tagMap.get(array[x][1])+">");
			}
		}	
		sb.append("</info>");
		System.out.println(sb.toString());
		return sb.toString();

	}

	/***************************************************************************
	 * 生成关键字在字符串中的索引 并排序
	 * 
	 * @param targetStr
	 * @return Map
	 */
	private Map getIndex(String targetStr) {
		/** 索引List */
		List<List<Integer>> index = new ArrayList<List<Integer>>();
		/** 索引Map */
		Map<Integer, String> indexMap = new HashMap<Integer, String>();
		Iterator it = keyWordsMap.entrySet().iterator();
		while (it.hasNext()) {
			Map.Entry entry = (Map.Entry) it.next();
			String key = entry.getKey().toString();
			String values = entry.getValue().toString();
			String[] val = values.split(",");
			if (val.length > 0)
				for (int x = 0; x < val.length; x++) {
					Pattern pattern = Pattern.compile(val[x]);
					Matcher matcher = pattern.matcher(targetStr);
					if (matcher.find()) {
						List list = new ArrayList();
						list.add(matcher.start());
						list.add(matcher.end());
						index.add(list);
						indexMap.put(matcher.end(), key);
						break;
					}
				}
		}
		
		
		if(index.size()==0)
			return null;
		// 对主索引排序
		int array[][] = sort(index);
		Map resMap = new HashMap();
		resMap.put(INDEXMAP, indexMap);
		resMap.put(INDEXARRAY, array);
		return resMap;
	}

	/***************************************************************************
	 * 内部索引
	 * 
	 * @param keyword
	 * @param keywordSet
	 * @return
	 */
	public int[][] sort(List<List<Integer>> index) {
		int arr[][]= new int[index.size()][2];
		for(int x=0;x<index.size();x++){
			List <Integer>ls1= index.get(x);
			arr[x][0]=ls1.get(0);
			arr[x][1]=ls1.get(1);
		}
		for(int x=0;x<index.size();x++){
			for(int y = 0; y < index.size() - x - 1; y++){
				if (arr[y][1] > arr[y+1][1]) {
					int tmpX=arr[y][0];
					int tmpY=arr[y][1];
					arr[y][0]=arr[y+1][0];
					arr[y][1]=arr[y+1][1];
					arr[y+1][0]=tmpX;
					arr[y+1][1]=tmpY;
				}
			}
		}
		//
		return arr;

	}

}